

import weakref


def bye():
    print('Released object...')


if __name__ == "__main__":
    # python采用引用计数的方式来管理对象，当对象的引用计数归零时，对象立即就被销毁
    s1 = {1, 2, 3}
    s2 = s1
    # 1.注册回调函数
    ender = weakref.finalize(s1, bye)
    print(ender.alive)
    # 2.del语句删除名称，而不是对象，此时s1变量不可用
    del s1
    # 3.由于s2还保持着引用，所以对象仍会存在，不会被销毁
    print(ender.alive)
    # 4.s2指向新变量，此时原变量无引用，对象会被立即释放并调用弱引用注册的回调函数
    s2 = 'another var'
    print(ender.alive)
